package com.example.theoretical_verification.string;

// 验证stringBuilder是线程不安全的
public class StringBuilderThreadSafety {
    public static void main(String[] args) {
        long startTime = System.nanoTime();
        // 创建一个共享的 StringBuffer 对象。没有内容，其实相当于是空串。而不是null。
        // 因为只要是使用new，那就说明开辟了内存空间，那就不会为null，只是说字符串没内容而已。
        StringBuilder stringBuilder = new StringBuilder("");

        // 创建两个线程，分别向 StringBuffer 对象中添加字符串
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                stringBuilder.append("A");
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                stringBuilder.append("B");
            }
        });

        // 启动线程
        thread1.start();
        thread2.start();

        // 等待两个线程执行完毕
        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long endTime = System.nanoTime();
        long elapsedTime = endTime - startTime;

        // 输出最终的结果
        System.out.println("方法执行耗时: " + elapsedTime + " 纳秒");
        System.out.println("stringBuilder length: " + stringBuilder.length());
        assert stringBuilder.length() == 2000 : "长度如果不是为2000那就是发生了线程安全问题";
    }
}
